home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Environments / PowerLisp 2.01 / Supplemental Documentation / Documentation / Chapter 13. Characters < prev    next >
Text File  |  1995-03-27  |  37KB  |  883 lines

  1. Common Lisp the Language, 2nd Edition
  2. -------------------------------------------------------------------------------
  3.  
  4. 13. Characters
  5.  
  6. Common Lisp provides a character data type; objects of this type represent
  7. printed symbols such as letters.
  8.  
  9. In general, characters in Common Lisp are not true objects; eq cannot be
  10. counted upon to operate on them reliably. In particular, it is possible that
  11. the expression
  12.  
  13. (let ((x z) (y z)) (eq x y))
  14.  
  15. may be false rather than true, if the value of z is a character.
  16.  
  17. -------------------------------------------------------------------------------
  18. Rationale: This odd breakdown of eq in the case of characters allows the
  19. implementor enough design freedom to produce exceptionally efficient code on
  20. conventional architectures. In this respect the treatment of characters exactly
  21. parallels that of numbers, as described in chapter 12.
  22. -------------------------------------------------------------------------------
  23.  
  24.  
  25.  
  26. ------------------------------------------------------------------------------
  27. Table 13-1: Standard Character Labels, Glyphs, and Descriptions
  28.  
  29.                             SM05 @ commercial at        SD13 ` grave accent
  30. SP02 ! exclamation mark     LA02 A capital A            LA01 a small a
  31. SP04 " quotation mark       LB02 B capital B            LB01 b small b
  32. SM01 # number sign          LC02 C capital C            LC01 c small c
  33. SC03 $ dollar sign          LD02 D capital D            LD01 d small d
  34. SM02 % percent sign         LE02 E capital E            LE01 e small e
  35. SM03 & ampersand            LF02 F capital F            LF01 f small f
  36. SP05 ' apostrophe           LG02 G capital G            LG01 g small g
  37. SP06 ( left parenthesis     LH02 H capital H            LH01 h small h
  38. SP07 ) right parenthesis    LI02 I capital I            LI01 i small i
  39. SM04 * asterisk             LJ02 J capital J            LJ01 j small j
  40. SA01 + plus sign            LK02 K capital K            LK01 k small k
  41. SP08 , comma                LL02 L capital L            LL01 l small l
  42. SP10 - hyphen or minus sign LM02 M capital M            LM01 m small m
  43. SP11 . period or full stop  LN02 N capital N            LN01 n small n
  44. SP12 / solidus              LO02 O capital O            LO01 o small o
  45. ND10 0 digit 0              LP02 P capital P            LP01 p small p
  46. ND01 1 digit 1              LQ02 Q capital Q            LQ01 q small q
  47. ND02 2 digit 2              LR02 R capital R            LR01 r small r
  48. ND03 3 digit 3              LS02 S capital S            LS01 s small s
  49. ND04 4 digit 4              LT02 T capital T            LT01 t small t
  50. ND05 5 digit 5              LU02 U capital U            LU01 u small u
  51. ND06 6 digit 6              LV02 V capital V            LV01 v small v
  52. ND07 7 digit 7              LW02 W capital W            LW01 w small w
  53. ND08 8 digit 8              LX02 X capital X            LX01 x small x
  54. ND09 9 digit 9              LY02 Y capital Y            LY01 y small y
  55. SP13 : colon                LZ02 Z capital Z            LZ01 z small z
  56. SP14 ; semicolon            SM06 [ left square bracket  SM11 { left curly bracket
  57. SA03 < less-than sign       SM07 \ reverse solidus      SM13 | vertical bar
  58. SA04 = equals sign          SM08 ] right square bracket SM14 } right curly bracket
  59. SA05 > greater-than sign    SD15 ^ circumflex accent    SD19 ~ tilde
  60. SP15 ? question mark        SP09 _ low line
  61. ------------------------------------------------------------------------------
  62.  
  63. If two objects are to be compared for ``identity,'' but either might be a
  64. character, then the predicate eql is probably appropriate.
  65.  
  66. [change_begin]
  67. X3J13 voted in March 1989 (CHARACTER-PROPOSAL)   to approve the following
  68. definitions and terminology for use in discussing character facilities in
  69. Common Lisp.
  70.  
  71. A character repertoire defines a collection of characters independent of their
  72. specific rendered image or font. (This corresponds to the mathematical notion
  73. of a set, but the term character set is avoided here because it has been used
  74. in the past to mean both what is here called a repertoire and what is here
  75. called a coded character set.) Character repertoires are specified independent
  76. of coding and their characters are identified only with a unique character
  77. label, a graphic symbol, and a character description. As an example, table 13-1
  78. shows the character labels, graphic symbols, and character descriptions for all
  79. of the characters in the repertoire standard-char except for #\Space and
  80. #\Newline.
  81.  
  82. Every Common Lisp implementation must support the standard character repertoire
  83. as well as repertoires named base-character, extended-character, and character.
  84. Other repertoires may be supported as well. X3J13 voted in June 1989
  85. (MORE-CHARACTER-PROPOSAL)   to specify that names of repertoires may be used as
  86. type specifiers. Such types must be subtypes of character; that is, in a given
  87. implementation the repertoire named character must encompass all the character
  88. objects supported by that implementation.
  89.  
  90. A coded character set is a character repertoire plus an encoding that provides
  91. a bijective mapping between each character in the set and a number (typically a
  92. non-negative integer) that serves as the character representation. There are
  93. numerous internationally standardized coded character sets.
  94.  
  95. A character may be included in one or more character repertoires. Similarly, a
  96. character may be included in one or more coded character sets.
  97.  
  98. To ensure that each character is uniquely defined, we may use a universal
  99. registry of characters that incorporates a collection of distinguished
  100. repertoires called character scripts that form an exhaustive partition of all
  101. characters. That is, each character is included in exactly one character
  102. script. (Draft ISO 10646 Coded Character Set Standard, if eventually approved
  103. as a standard, may become the practical realization of this universal
  104. registry.)
  105.  
  106. (X3J13 voted in June 1989 (MORE-CHARACTER-PROPOSAL)   to specify that an
  107. implementation must document the character scripts it supports. For each script
  108. the documentation should discuss character labels, glyphs, and descriptions;
  109. any canonicalization processes performed by the reader that result in treating
  110. distinct characters as equivalent; any canonicalization performed by format in
  111. processing directives; the behavior of char-upcase, char-downcase, and the
  112. predicates alpha-char-p, upper-case-p, lower-case-p, both-case-p,
  113. graphic-char-p, alphanumericp, char-equal, char-not-equal, char-lessp,
  114. char-greaterp, char-not-greaterp, and char-not-lessp for characters in the
  115. script; and behavior with respect to input and output, including coded
  116. character sets and external coding schemes.)
  117.  
  118. In Common Lisp a character data object is identified by its character code, a
  119. unique numerical code. Each character code is composed from a character script
  120. and a character label. The convention by which a character script and character
  121. label compose a character code is implementation dependent. [X3J13 did not
  122. approve all parts of the proposal from its Subcommittee on Characters. As a
  123. result, some features that were approved appear to have no purpose. X3J13
  124. wished to support the standardization by ISO of character scripts and coded
  125. character sets but declined to design facilities for use in Common Lisp until
  126. there has been more progress by ISO in this area. The approval of the
  127. terminology for scripts and labels gives a hint to implementors of likely
  128. directions for Common Lisp in the future.]
  129.  
  130. A character object that is classified as graphic, or displayable, has an
  131. associated glpyh. The glyph is the visual representation of the character. All
  132. other character data objects are classified as non-graphic.
  133.  
  134. This terminology assigns names to Common Lisp concepts in a manner consistent
  135. with related concepts discussed in various ISO standards for coded character
  136. sets and provides a demarcation between standardization activities. For
  137. example, facilities for manipulating characters, character scripts, and coded
  138. character sets are properly defined by a Common Lisp standard, but Common Lisp
  139. should not define standard character sets or standard character scripts.
  140. [change_end]
  141.  
  142. -------------------------------------------------------------------------------
  143.  
  144.    *  Character Attributes
  145.    *  Predicates on Characters
  146.    *  Character Construction and Selection
  147.    *  Character Conversions
  148.    *  Character Control-Bit Functions
  149.  
  150. -------------------------------------------------------------------------------
  151.  
  152. 13.1 Character Attributes
  153.  
  154. Every character has three attributes: code, bits, and font. The code attribute
  155. is intended to distinguish among the printed glyphs and formatting functions
  156. for characters. The bits attribute allows extra flags to be associated with a
  157. character. The font attribute permits a specification of the style of the
  158. glyphs (such as italics).
  159.  
  160. [change_begin]
  161. The treatment of character attributes in Common Lisp has not been entirely
  162. successful. The font attribute has not been widely used, for two reasons.
  163. First, a single integer, limited in most implementations to 255 at most, is not
  164. an adequate, convenient, or portable representation for a font. Second, in many
  165. applications where font information matters it is more convenient or more
  166. efficient to represent font information as shift codes that apply to many
  167. characters, rather than attaching font information separately to each
  168. character.
  169.  
  170. As for the bits attribute, it was intended to support character input from
  171. extended keyboards having extra ``shift'' keys. This, in turn, was imagined to
  172. support the programming of a portable EMACS-like editor in Common Lisp. (The
  173. EMACS command set is most convenient when the keyboard has separate ``control''
  174. and ``meta'' keys.) The bits attribute has been used in the implementation of
  175. such editors and other interactive interfaces. However, software that relies
  176. crucially on these extended characters will not be portable to Common Lisp
  177. implementations that do not support them.
  178.  
  179. X3J13 voted in March 1989 (CHARACTER-PROPOSAL)   and in June 1989
  180. (MORE-CHARACTER-PROPOSAL)   to revise considerably the treatment of characters
  181. in the language. The bits and font attributes are eliminated; instead a
  182. character may have implementation-defined attributes. The treatment of such
  183. attributes by existing character-handling functions is carefully constrained by
  184. certain rules.
  185.  
  186. Implementations are free to continue to support bits and font attributes, but
  187. they are formally regarded as implementation-defined attributes. The rules are
  188. generally consistent with the previous treatment of the bits and font
  189. attributes. My guess is that the font attribute as currently defined will
  190. wither away, but the bits attribute as defined by the first edition will
  191. continue to be supported as a de facto standard extension, because it fills a
  192. useful small purpose.
  193. [change_end]
  194.  
  195. [Constant]
  196. char-code-limit
  197.  
  198. The value of char-code-limit is a non-negative integer that is the upper
  199. exclusive bound on values produced by the function char-code, which returns the
  200. code component of a given character; that is, the values returned by char-code
  201. are non-negative and strictly less than the value of char-code-limit.
  202.  
  203. [change_begin]
  204. Common Lisp does not at present explicitly guarantee that all integers between
  205. zero and the value of char-code-limit are valid character codes, and so it is
  206. wise in any case for the programmer to assume that the space of assigned
  207. character codes may be sparse.
  208. [change_end]
  209.  
  210. [old_change_begin]
  211.  
  212. [Constant]
  213. char-font-limit
  214.  
  215. The value of char-font-limit is a non-negative integer that is the upper
  216. exclusive bound on values produced by the function char-font, which returns the
  217. font component of a given character; that is, the values returned by char-font
  218. are non-negative and strictly less than the value of char-font-limit.
  219.  
  220. -------------------------------------------------------------------------------
  221. Implementation note: No Common Lisp implementation is required to support
  222. non-zero font attributes; if it does not, then char-font-limit should be 1.
  223. -------------------------------------------------------------------------------
  224.  
  225. [old_change_end]
  226.  
  227. [change_begin]
  228. X3J13 voted in March 1989 (CHARACTER-PROPOSAL)   to eliminate char-font-limit.
  229.  
  230. Experience has shown that numeric codes are not an especially convenient, let
  231. alone portable, representation for font information. A system based on typeface
  232. names, type styles, and point sizes would be much better. (Macintosh software
  233. developers made the same discovery and have recently converted to a new font
  234. identification scheme.)
  235. [change_end]
  236.  
  237. [old_change_begin]
  238.  
  239. [Constant]
  240. char-bits-limit
  241.  
  242. The value of char-bits-limit is a non-negative integer that is the upper
  243. exclusive bound on values produced by the function char-bits, which returns the
  244. bits component of a given character; that is, the values returned by char-bits
  245. are non-negative and strictly less than the value of char-bits-limit. Note that
  246. the value of char-bits-limit will be a power of 2.
  247.  
  248. -------------------------------------------------------------------------------
  249. Implementation note: No Common Lisp implementation is required to support
  250. non-zero bits attributes; if it does not, then char-bits-limit should be 1.
  251. -------------------------------------------------------------------------------
  252.  
  253. [old_change_end]
  254.  
  255. [change_begin]
  256. X3J13 voted in March 1989 (CHARACTER-PROPOSAL)   to eliminate char-bits-limit.
  257. [change_end]
  258.  
  259. -------------------------------------------------------------------------------
  260.  
  261. 13.2. Predicates on Characters
  262.  
  263. The predicate characterp may be used to determine whether any Lisp object is a
  264. character object.
  265.  
  266. [Function]
  267. standard-char-p char
  268.  
  269. The argument char must be a character object. standard-char-p is true if the
  270. argument is a ``standard character,'' that is, an object of type standard-char.
  271.  
  272. Note that any character with a non-zero bits or font attribute is non-standard.
  273.  
  274. [Function]
  275. graphic-char-p char
  276.  
  277. The argument char must be a character object. graphic-char-p is true if the
  278. argument is a ``graphic'' (printing) character, and false if it is a
  279. ``non-graphic'' (formatting or control) character. Graphic characters have a
  280. standard textual representation as a single glyph, such as A or * or =. By
  281. convention, the space character is considered to be graphic. Of the standard
  282. characters all but #\Newline are graphic. The semi-standard characters
  283. #\Backspace, #\Tab, #\Rubout, #\Linefeed, #\Return, and #\Page are not graphic.
  284.  
  285. Programs may assume that graphic characters of font 0 are all of the same width
  286. when printed, for example, for purposes of columnar formatting. (This does not
  287. prohibit the use of a variable-pitch font as font 0, but merely implies that
  288. every implementation of Common Lisp must provide some mode of operation in
  289. which font 0 is a fixed-pitch font.) Portable programs should assume that, in
  290. general, non-graphic characters and characters of other fonts may be of varying
  291. widths.
  292.  
  293. Any character with a non-zero bits attribute is non-graphic.
  294.  
  295. [old_change_begin]
  296. [Function]
  297. string-char-p char
  298.  
  299. The argument char must be a character object. string-char-p is true if char can
  300. be stored into a string, and otherwise is false. Any character that satisfies
  301. standard-char-p also satisfies string-char-p; others may also.
  302. [old_change_end]
  303.  
  304. [change_begin]
  305. X3J13 voted in March 1989 (CHARACTER-PROPOSAL)   to eliminate string-char-p.
  306. [change_end]
  307.  
  308. [Function]
  309. alpha-char-p char
  310.  
  311. The argument char must be a character object. alpha-char-p is true if the
  312. argument is an alphabetic character, and otherwise is false.
  313.  
  314. If a character is alphabetic, then it is perforce graphic. Therefore any
  315. character with a non-zero bits attribute cannot be alphabetic. Whether a
  316. character is alphabetic may depend on its font number.
  317.  
  318. Of the standard characters (as defined by standard-char-p), the letters A
  319. through Z and a through z are alphabetic.
  320.  
  321. [Function]
  322. upper-case-p char
  323. lower-case-p char
  324. both-case-p char
  325.  
  326. The argument char must be a character object.
  327.  
  328. upper-case-p is true if the argument is an uppercase character, and otherwise
  329. is false.
  330.  
  331. lower-case-p is true if the argument is a lowercase character, and otherwise is
  332. false.
  333.  
  334. both-case-p is true if the argument is an uppercase character and there is a
  335. corresponding lowercase character (which can be obtained using char-downcase),
  336. or if the argument is a lowercase character and there is a corresponding
  337. uppercase character (which can be obtained using char-upcase).
  338.  
  339. If a character is either uppercase or lowercase, it is necessarily alphabetic
  340. (and therefore is graphic, and therefore has a zero bits attribute). However,
  341. it is permissible in theory for an alphabetic character to be neither uppercase
  342. nor lowercase (in a non-Roman font, for example).
  343.  
  344. Of the standard characters (as defined by standard-char-p), the letters A
  345. through Z are uppercase and a through z are lowercase.
  346.  
  347. [Function]
  348. digit-char-p char &optional (radix 10)
  349.  
  350. The argument char must be a character object, and radix must be a non-negative
  351. integer. If char is not a digit of the radix specified by radix, then
  352. digit-char-p is false; otherwise it returns a non-negative integer that is the
  353. ``weight'' of char in that radix.
  354.  
  355. Digits are necessarily graphic characters.
  356.  
  357. Of the standard characters (as defined by standard-char-p), the characters 0
  358. through 9, A through Z, and a through z are digits. The weights of 0 through 9
  359. are the integers 0 through 9, and of A through Z (and also a through z) are 10
  360. through 35. digit-char-p returns the weight for one of these digits if and only
  361. if its weight is strictly less than radix. Thus, for example, the digits for
  362. radix 16 are
  363.  
  364. 0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
  365.  
  366. Here is an example of the use of digit-char-p:
  367.  
  368. (defun convert-string-to-integer (str &optional (radix 10))
  369.   "Given a digit string and optional radix, return an integer."
  370.   (do ((j 0 (+ j 1))
  371.        (n 0 (+ (* n radix)
  372.                (or (digit-char-p (char str j) radix)
  373.                    (error "Bad radix-~D digit: ~C"
  374.                           radix
  375.                           (char str j))))))
  376.       ((= j (length str)) n)))
  377.  
  378. [Function]
  379. alphanumericp char
  380.  
  381. The argument char must be a character object. alphanumericp is true if char is
  382. either alphabetic or numeric. By definition,
  383.  
  384. (alphanumericp x)
  385.    == (or (alpha-char-p x) (not (null (digit-char-p x))))
  386.  
  387. Alphanumeric characters are therefore necessarily graphic (as defined by the
  388. predicate graphic-char-p).
  389.  
  390. Of the standard characters (as defined by standard-char-p), the characters 0
  391. through 9, A through Z, and a through z are alphanumeric.
  392.  
  393. [Function]
  394. char= character &rest more-characters
  395. char/= character &rest more-characters
  396. char< character &rest more-characters
  397. char> character &rest more-characters
  398. char<= character &rest more-characters
  399. char>= character &rest more-characters
  400.  
  401. The arguments must all be character objects. These functions compare the
  402. objects using the implementation-dependent total ordering on characters, in a
  403. manner analogous to numeric comparisons by = and related functions.
  404.  
  405. The total ordering on characters is guaranteed to have the following
  406. properties:
  407.  
  408.    *  The standard alphanumeric characters obey the following partial ordering:
  409.  
  410.      A<B<C<D<E<F<G<H<I<J<K<L<M<N<O<P<Q<R<S<T<U<V<W<X<Y<Z
  411.      to 0pta<b<c<d<e<f<g<h<i<j<k<l<m<n<o<                              p<q<r<s<t<u<v<w<x<y<z
  412.      0<1<2<3<4<5<6<7<8<9
  413.      either 9<A or Z<0
  414.      either 9<a or z<0
  415.  
  416.      This implies that alphabetic ordering holds within each case (upper and
  417.      lower), and that the digits as a group are not interleaved with letters.
  418.      However, the ordering or possible interleaving of uppercase letters and
  419.      lowercase letters is unspecified. (Note that both the ASCII and the EBCDIC
  420.      character sets conform to this specification. As it happens, neither
  421.      ordering interleaves uppercase and lowercase letters: in the ASCII
  422.      ordering, 9<A and Z<a, whereas in the EBCDIC ordering z<A and Z<0.)
  423.  
  424. [old_change_begin]
  425.  
  426.    *  If two characters have the same bits and font attributes, then their
  427.      ordering by char< is consistent with the numerical ordering by the
  428.      predicate < on their code attributes.
  429.  
  430.    *  If two characters differ in any attribute (code, bits, or font), then
  431.      they are different.
  432.  
  433. [old_change_end]
  434.  
  435. [change_begin]
  436. X3J13 voted in March 1989 (CHARACTER-PROPOSAL)   to replace the notion of bits
  437. and font attributes with that of implementation-defined attributes.
  438.  
  439.    *  If two characters have identical implementation-defined attributes, then
  440.      their ordering by char< is consistent with the numerical ordering by the
  441.      predicate < on their codes, and similarly for char>, char<=, and char>=.
  442.  
  443.    *  If two characters differ in any implementation-defined attribute, then
  444.      they are not char=.
  445.  
  446. [change_end]
  447.  
  448. The total ordering is not necessarily the same as the total ordering on the
  449. integers produced by applying char-int to the characters (although it is a
  450. reasonable implementation technique to use that ordering).
  451.  
  452. While alphabetic characters of a given case must be properly ordered, they need
  453. not be contiguous; thus (char<= #\a x #\z) is not a valid way of determining
  454. whether or not x is a lowercase letter. That is why a separate lower-case-p
  455. predicate is provided.
  456.  
  457. (char= #\d #\d) is true.
  458. (char/= #\d #\d) is false.
  459. (char= #\d #\x) is false.
  460. (char/= #\d #\x) is true.
  461. (char= #\d #\D) is false.
  462. (char/= #\d #\D) is true.
  463. (char= #\d #\d #\d #\d) is true.
  464. (char/= #\d #\d #\d #\d) is false.
  465. (char= #\d #\d #\x #\d) is false.
  466. (char/= #\d #\d #\x #\d) is false.
  467. (char= #\d #\y #\x #\c) is false.
  468. (char/= #\d #\y #\x #\c) is true.
  469. (char= #\d #\c #\d) is false.
  470. (char/= #\d #\c #\d) is false.
  471. (char< #\d #\x) is true.
  472. (char<= #\d #\x) is true.
  473. (char< #\d #\d) is false.
  474. (char<= #\d #\d) is true.
  475. (char< #\a #\e #\y #\z) is true.
  476. (char<= #\a #\e #\y #\z) is true.
  477. (char< #\a #\e #\e #\y) is false.
  478. (char<= #\a #\e #\e #\y) is true.
  479. (char> #\e #\d) is true.
  480. (char>= #\e #\d) is true.
  481. (char> #\d #\c #\b #\a) is true.
  482. (char>= #\d #\c #\b #\a) is true.
  483. (char> #\d #\d #\c #\a) is false.
  484. (char>= #\d #\d #\c #\a) is true.
  485. (char> #\e #\d #\b #\c #\a) is false.
  486. (char>= #\e #\d #\b #\c #\a) is false.
  487. (char> #\z #\A) may be true or false.
  488. (char> #\Z #\a) may be true or false.
  489.  
  490. There is no requirement that (eq c1 c2) be true merely because (char= c1 c2) is
  491. true. While eq may distinguish two character objects that char= does not, it is
  492. distinguishing them not as characters, but in some sense on the basis of a
  493. lower-level implementation characteristic. (Of course, if (eq c1 c2) is true,
  494. then one may expect (char= c1 c2) to be true.) However, eql and equal compare
  495. character objects in the same way that char= does.
  496.  
  497. [Function]
  498. char-equal character &rest more-characters
  499. char-not-equal character &rest more-characters
  500. char-lessp character &rest more-characters
  501. char-greaterp character &rest more-characters
  502. char-not-greaterp character &rest more-characters
  503. char-not-lessp character &rest more-characters
  504.  
  505. [old_change_begin]
  506. The predicate char-equal is like char=, and similarly for the others, except
  507. according to a different ordering such that differences of bits attributes and
  508. case are ignored, and font information is taken into account in an
  509. implementation-dependent manner.
  510. [old_change_end]
  511.  
  512. [change_begin]
  513. X3J13 voted in March 1989 (CHARACTER-PROPOSAL)   to replace the notion of bits
  514. and font attributes with that of implementation-defined attributes. The effect,
  515. if any, of each such attribute on the behavior of char-equal, char-not-equal,
  516. char-lessp, char-greaterp, char-not-greaterp, and char-not-lessp must be
  517. specified as part of the definition of that attribute.
  518. [change_end]
  519.  
  520. For the standard characters, the ordering is such that A=a, B=b, and so on, up
  521. to Z=z, and furthermore either 9<A or Z<0. For example:
  522.  
  523. (char-equal #\A #\a) is true.
  524. (char= #\A #\a) is false.
  525. (char-equal #\A #\Control-A) is true.
  526.  
  527. [old_change_begin]
  528. The ordering may depend on the font information. For example, an implementation
  529. might decree that (char-equal #\p #\p) be true, but that (char-equal #\p #\pi)
  530. be false (where #\pi is a lowercase p in some font). Assuming italics to be in
  531. font 1 and the Greek alphabet in font 2, this is the same as saying that
  532. (char-equal #0\p #1\p) may be true and at the same time (char-equal #0\p #2\p)
  533. may be false.
  534. [old_change_end]
  535.  
  536. -------------------------------------------------------------------------------
  537.  
  538. 13.3. Character Construction and Selection
  539.  
  540. These functions may be used to extract attributes of a character and to
  541. construct new characters.
  542.  
  543. [Function]
  544. char-code char
  545.  
  546. The argument char must be a character object. char-code returns the code
  547. attribute of the character object; this will be a non-negative integer less
  548. than the (normal) value of the variable char-code-limit.
  549.  
  550. [change_begin]
  551. This is usually what you need in order to treat a character as an index into a
  552. vector. The length of the vector should then be equal to char-code-limit. Be
  553. careful how you initialize this vector; remember that you cannot necessarily
  554. expect all non-negative integers less than char-code-limit to be valid
  555. character codes.
  556. [change_end]
  557.  
  558. [old_change_begin]
  559.  
  560. [Function]
  561. char-bits char
  562.  
  563. The argument char must be a character object. char-bits returns the bits
  564. attribute of the character object; this will be a non-negative integer less
  565. than the (normal) value of the variable char-bits-limit.
  566. [old_change_end]
  567.  
  568. [change_begin]
  569. X3J13 voted in March 1989 (CHARACTER-PROPOSAL)   to eliminate char-bits.
  570. [change_end]
  571.  
  572. [old_change_begin]
  573.  
  574. [Function]
  575. char-font char
  576.  
  577. The argument char must be a character object. char-font returns the font
  578. attribute of the character object; this will be a non-negative integer less
  579. than the (normal) value of the variable char-font-limit.
  580. [old_change_end]
  581.  
  582. [change_begin]
  583. X3J13 voted in March 1989 (CHARACTER-PROPOSAL)   to eliminate char-font.
  584.  
  585. The references to the ``normal'' values of the ``variables'' char-code-limit,
  586. char-bits-limit, and char-font-limit in the descriptions of char-code,
  587. char-bits, and char-font were an oversight on my part. Early in the design of
  588. Common Lisp they were indeed variables, but they are at present defined to be
  589. constants, and their values therefore are always normal and should not change.
  590. But this point is now moot.
  591. [change_end]
  592.  
  593. [Function]
  594. code-char code &optional (bits 0) (font 0)
  595.  
  596. [old_change_begin]
  597. All three arguments must be non-negative integers. If it is possible in the
  598. implementation to construct a character object whose code attribute is code,
  599. whose bits attribute is bits, and whose font attribute is font, then such an
  600. object is returned; otherwise nil is returned.
  601.  
  602. For any integers c, b, and f, if (code-char c b f) is not nil then
  603.  
  604. (char-code (code-char c b f)) => c
  605. (char-bits (code-char c b f)) => b
  606. (char-font (code-char c b f)) => f
  607.  
  608. If the font and bits attributes of a character object c are zero, then it is
  609. the case that
  610.  
  611. (char= (code-char (char-code c)) c)
  612.  
  613. is true.
  614. [old_change_end]
  615.  
  616. [change_begin]
  617. X3J13 voted in March 1989 (CHARACTER-PROPOSAL)   to eliminate the bits and font
  618. arguments from the specification of code-char.
  619. [change_end]
  620.  
  621. [old_change_begin]
  622.  
  623. [Function]
  624. make-char char &optional (bits 0) (font 0)
  625.  
  626. The argument char must be a character, and bits and font must be non-negative
  627. integers. If it is possible in the implementation to construct a character
  628. object whose code attribute is the same as the code attribute of char, whose
  629. bits attribute is bits, and whose font attribute is font, then such an object
  630. is returned; otherwise nil is returned.
  631.  
  632. If bits and font are zero, then make-char cannot fail. This implies that for
  633. every character object one can ``turn off'' its bits and font attributes.
  634. [old_change_end]
  635.  
  636. [change_begin]
  637. X3J13 voted in March 1989 (CHARACTER-PROPOSAL)   to eliminate make-char.
  638. [change_end]
  639.  
  640. -------------------------------------------------------------------------------
  641.  
  642. 13.4. Character Conversions
  643.  
  644. These functions perform various transformations on characters, including case
  645. conversions.
  646.  
  647. [Function]
  648. character object
  649.  
  650. The function character coerces its argument to be a character if possible; see
  651. coerce.
  652.  
  653. (character x) == (coerce x 'character)
  654.  
  655. [Function]
  656. char-upcase char
  657. char-downcase char
  658.  
  659. The argument char must be a character object. char-upcase attempts to convert
  660. its argument to an uppercase equivalent; char-downcase attempts to convert its
  661. argument to a lowercase equivalent.
  662.  
  663. [old_change_begin]
  664. char-upcase returns a character object with the same font and bits attributes
  665. as char, but with possibly a different code attribute. If the code is different
  666. from char's, then the predicate lower-case-p is true of char, and upper-case-p
  667. is true of the result character. Moreover, if (char= (char-upcase x) x) is not
  668. true, then it is true that
  669.  
  670. (char= (char-downcase (char-upcase x)) x)
  671.  
  672. Similarly, char-downcase returns a character object with the same font and bits
  673. attributes as char, but with possibly a different code attribute. If the code
  674. is different from char's, then the predicate upper-case-p is true of char, and
  675. lower-case-p is true of the result character. Moreover, if (char=
  676. (char-downcase x) x) is not true, then it is true that
  677.  
  678. (char= (char-upcase (char-downcase x)) x)
  679.  
  680. [old_change_end]
  681.  
  682. Note that the action of char-upcase and char-downcase may depend on the bits
  683. and font attributes of the character. In particular, they have no effect on a
  684. character with a non-zero bits attribute, because such characters are by
  685. definition not alphabetic. See alpha-char-p.
  686.  
  687. [change_begin]
  688. X3J13 voted in March 1989 (CHARACTER-PROPOSAL)   to replace the notion of bits
  689. and font attributes with that of implementation-defined attributes. The effect
  690. of char-upcase and char-downcase is to preserve implementation-defined
  691. attributes.
  692. [change_end]
  693.  
  694. [Function]
  695. digit-char weight &optional (radix 10) (font 0)
  696.  
  697. All arguments must be integers. digit-char determines whether or not it is
  698. possible to construct a character object whose font attribute is font, and
  699. whose code is such that the result character has the weight weight when
  700. considered as a digit of the radix radix (see the predicate digit-char-p). It
  701. returns such a character if that is possible, and otherwise returns nil.
  702.  
  703. digit-char cannot return nil if font is zero, radix is between 2 and 36
  704. inclusive, and weight is non-negative and less than radix.
  705.  
  706. If more than one character object can encode such a weight in the given radix,
  707. one will be chosen consistently by any given implementation; moreover, among
  708. the standard characters, uppercase letters are preferred to lowercase letters.
  709. For example:
  710.  
  711. (digit-char 7) => #\7
  712. (digit-char 12) => nil
  713. (digit-char 12 16) => #\C     ;not #\c
  714. (digit-char 6 2) => nil
  715. (digit-char 1 2) => #\1
  716.  
  717. Note that no argument is provided for specifying the bits component of the
  718. returned character, because a digit cannot have a non-zero bits component. The
  719. reasoning is that every digit is graphic (see digit-char-p) and no graphic
  720. character has a non-zero bits component (see graphic-char-p).
  721.  
  722. [change_begin]
  723. X3J13 voted in March 1989 (CHARACTER-PROPOSAL)   to eliminate the font argument
  724. from the specification of digit-char.
  725. [change_end]
  726.  
  727. [Function]
  728. char-int char
  729.  
  730. The argument char must be a character object. char-int returns a non-negative
  731. integer encoding the character object.
  732.  
  733. If the font and bits attributes of char are zero, then char-int returns the
  734. same integer char-code would. Also,
  735.  
  736. (char= c1 c2) == (= (char-int c1) (char-int c2))
  737.  
  738. for characters c1 and c2.
  739.  
  740. This function is provided primarily for the purpose of hashing characters.
  741.  
  742. [old_change_begin]
  743.  
  744. [Function]
  745. int-char integer
  746.  
  747. The argument must be a non-negative integer. int-char returns a character
  748. object c such that (char-int c) is equal to integer, if possible; otherwise
  749. int-char returns false.
  750. [old_change_end]
  751.  
  752. [change_begin]
  753. X3J13 voted in March 1989 (CHARACTER-PROPOSAL)   to eliminate int-char.
  754. [change_end]
  755.  
  756. [Function]
  757. char-name char
  758.  
  759. The argument char must be a character object. If the character has a name, then
  760. that name (a string) is returned; otherwise nil is returned. All characters
  761. that have zero font and bits attributes and that are non-graphic (do not
  762. satisfy the predicate graphic-char-p) have names. Graphic characters may or may
  763. not have names.
  764.  
  765. The standard newline and space characters have the respective names Newline and
  766. Space. The semi-standard characters have the names Tab, Page, Rubout, Linefeed,
  767. Return, and Backspace.
  768.  
  769. Characters that have names can be notated as #\ followed by the name. (See
  770. section 22.1.4.) Although the name may be written in any case, it is stylish to
  771. capitalize it thus: #\Space.
  772.  
  773. char-name will only locate ``simple'' character names; it will not construct
  774. names such as Control-Space on the basis of the character's bits attribute.
  775.  
  776. [change_begin]
  777. The easiest way to get a name that includes the bits attribute of a character c
  778. is (format nil "~:C" c).
  779. [change_end]
  780.  
  781. [Function]
  782. name-char name
  783.  
  784. The argument name must be an object coerceable to a string as if by the
  785. function string. If the name is the same as the name of a character object (as
  786. determined by string-equal), that object is returned; otherwise nil is
  787. returned.
  788.  
  789. -------------------------------------------------------------------------------
  790.  
  791. 13.5. Character Control-Bit Functions
  792.  
  793. [old_change_begin]
  794. Common Lisp provides explicit names for four bits of the bits attribute:
  795. Control, Meta, Hyper, and Super. The following definitions are provided for
  796. manipulating these. Each Common Lisp implementation provides these functions
  797. for compatibility, even if it does not support any or all of the bits named
  798. below.
  799.  
  800. [Constant]
  801. char-control-bit 
  802. char-meta-bit 
  803. char-super-bit 
  804. char-hyper-bit 
  805.  
  806. The values of these named constants are the ``weights'' (as integers) for the
  807. four named control bits. The weight of the control bit is 1; of the meta bit,
  808. 2; of the super bit, 4; and of the hyper bit, 8.
  809.  
  810. If a given implementation of Common Lisp does not support a particular bit,
  811. then the corresponding constant is zero instead.
  812. [old_change_end]
  813.  
  814. [change_begin]
  815. X3J13 voted in March 1989 (CHARACTER-PROPOSAL)   to eliminate all four of the
  816. constants char-control-bit, char-meta-bit, char-super-bit, and char-hyper-bit.
  817.  
  818. When Common Lisp was first designed, keyboards with ``extra bits'' were
  819. relatively rare. The bits attribute was originally designed to support input
  820. from keyboards in use at Stanford and M.I.T. circa 1981.
  821.  
  822. Since that time such extended keyboards have come into wider use. Notable here
  823. are the keyboards associated with certain personal computers and workstations.
  824. For example, in some specific applications the command and option keys of Apple
  825. Macintosh keyboards have had the connotations of control and meta. Macintosh II
  826. extended keyboards also have keys marked control whose use is analogous to that
  827. of hyper on the old M.I.T. keyboards. IBM PC personal computer keyboards have
  828. alt keys that function much like meta keys; similarly, keyboards on Sun
  829. workstations have keys very much like meta keys but labelled left and right.
  830. [change_end]
  831.  
  832. [old_change_begin]
  833.  
  834. [Function]
  835. char-bit char name
  836.  
  837. char-bit takes a character object char and the name of a bit, and returns
  838. non-nil if the bit of that name is set in char, or nil if the bit is not set in
  839. char. For example:
  840.  
  841. (char-bit #\Control-X :control) => true
  842.  
  843. Valid values for name are implementation-dependent, but typically are :control,
  844. :meta, :hyper, and :super. It is an error to give char-bit the name of a bit
  845. not supported by the implementation.
  846.  
  847. If the argument char is specified by a form that is a place form acceptable to
  848. setf, then setf may be used with char-bit to modify a bit of the character
  849. stored in that place. The effect is to perform a set-char-bit operation and
  850. then store the result back into the place.
  851. [old_change_end]
  852.  
  853. [change_begin]
  854. X3J13 voted in March 1989 (CHARACTER-PROPOSAL)   to eliminate char-bit.
  855. [change_end]
  856.  
  857. [old_change_begin]
  858.  
  859. [Function]
  860. set-char-bit char name newvalue
  861.  
  862. char-bit takes a character object char, the name of a bit, and a flag. A
  863. character is returned that is just like char except that the named bit is set
  864. or reset according to whether newvalue is non-nil or nil. Valid values for name
  865. are implementation-dependent, but typically are :control, :meta, :hyper, and
  866. :super. For example:
  867.  
  868. (set-char-bit #\X :control t) => #\Control-X
  869. (set-char-bit #\Control-X :control t) => #\Control-X
  870. (set-char-bit #\Control-X :control nil) => #\X
  871.  
  872. [old_change_end]
  873.  
  874. [change_begin]
  875. X3J13 voted in March 1989 (CHARACTER-PROPOSAL)   to eliminate set-char-bit.
  876. [change_end]
  877.  
  878. -------------------------------------------------------------------------------
  879.  
  880.  
  881.  
  882.  
  883.